package com.it.myreflect3;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /*
            Class类中用于获取成员方法的方法
            Method[]getMethods(): 返回所有公共成员方法对象的数组，包括继承的
            Method[]getDeclaredMethods(): 返回所有成员方法对象的数组，不包括继承的
            Method getMethod(String name, Class……parameterTypes): 返回单个公共成员方法对象
            Method getDeclaredMethod(String name, Class…parameterTypes): 返回单个成员方法对象
            Method类中用于创建对象的方法
            Object invoke(Object obj, Object…args):
            运行方法
            参数一：用obj对象调用该方法
            参数二：调用方法的传递的参数（如果没有就不写）
            返回值：方法的返回值（如果没有就不写）
         */
        //1.获取class字节码文件对象
        Class clazz = Class.forName("com.it.myreflect3.Student");
        //2.获取里面所有的方法对象（包含父类中所有的的公共方法）
        /*System.out.println("---包含继承父类的---");
        Method[] methods1 = clazz.getMethods();
        for (Method method : methods1) {
            System.out.println(method);
        }
        //不包含父类继承的方法
        System.out.println("---不包含继承父类的---");
        Method[] methods2 = clazz.getDeclaredMethods();
        for (Method method : methods2) {
            System.out.println(method);
        }*/
        //获取指定的单一方法
        System.out.println("---获取指定的单一方法---");
        Method m = clazz.getDeclaredMethod("eat",String.class);
        System.out.println(m);

        //获取方法的修饰符
        System.out.println("---获取方法的修饰符---");
        int mod = m.getModifiers();
        System.out.println(mod);

        //获取方法的名字
        System.out.println("---获取方法的名字---");
        String name = m.getName();
        System.out.println(name);

        //获取方法的形参
        System.out.println("---获取方法的形参---");
        Parameter[] parameters = m.getParameters();
        for(Parameter p : parameters){
            System.out.println(p);
        }

        //获取方法的抛出的异常
        System.out.println("---获取方法的抛出的异常---");
        Class[] exceptionTypes = m.getExceptionTypes();
        for(Class c : exceptionTypes){
            System.out.println(c);
        }

        //方法运行
        System.out.println("---方法运行---");
        Student s = new Student();
        m.setAccessible(true);
        Object result = m.invoke(s,"汉堡包");
        System.out.println(result);
    }
}
